package com.cleaningcloud.erp.mapper;

import com.cleaningcloud.erp.domain.ErpSale;
import com.cleaningcloud.erp.domain.ErpSaleDetails;
import com.cleaningcloud.erp.domain.dto.ErpSaleDto;
import com.cleaningcloud.erp.domain.statistics.SummaryStock;
import com.cleaningcloud.erp.domain.vo.ErpSaleDetailsVo;
import com.cleaningcloud.erp.domain.vo.ErpSaleVo;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 销售单Mapper接口
 *
 * @author cleaningcloud
 * @date 2024-10-02
 */
public interface ErpSaleMapper {
    /**
     * 查询销售单
     *
     * @param saleId 销售单主键
     * @return 销售单
     */
    ErpSaleVo selectErpSaleBySaleId(Long saleId);

    /**
     * 查询销售单列表
     *
     * @param erpSale 销售单
     * @return 销售单集合
     */
    List<ErpSaleVo> selectErpSaleList(ErpSaleDto erpSale);

    /**
     * 新增销售单
     *
     * @param erpSale 销售单
     * @return 结果
     */
    int insertErpSale(ErpSale erpSale);

    /**
     * 修改销售单
     *
     * @param erpSale 销售单
     * @return 结果
     */
    int updateErpSale(ErpSale erpSale);

    /**
     * 删除销售单
     *
     * @param saleId 销售单主键
     * @return 结果
     */
    int deleteErpSaleBySaleId(Long saleId);

    /**
     * 批量删除销售单
     *
     * @param saleIds 需要删除的数据主键集合
     * @return 结果
     */
    int deleteErpSaleBySaleIds(Long[] saleIds);


    /**
     * 批量新增销售明细单
     *
     * @param list
     */
    void batchSaleDetailsInsert(List<ErpSaleDetails> list);

    /**
     * 根据销售单id批量删除销售单明细
     *
     * @param saleId
     */
    @Delete("delete from erp_sale_details where sale_id = #{saleId}")
    int deleteSaleDetailsBySaleId(@Param("saleId") Long saleId);


    /**
     * 根据客户id查询审核通过的销售单数量
     *
     * @param customerId
     * @return
     */
    @Select("select count(1) from erp_sale where customer_id = #{customerId} and sale_status = 2")
    int queryApprovedByCustomerId(@Param("customerId") Long customerId);


    /**
     * 根据销售单号查询明细
     *
     * @param saleNo
     * @return
     */
    ErpSaleVo getSaleBySaleNo(@Param("saleNo") String saleNo);

    /**
     * 根据销售单号查询详情
     *
     * @param saleNo
     * @return
     */
    ErpSaleVo getSaleInfoByNo(@Param("saleNo") String saleNo);


    /**
     * 汇总备货
     *
     * @return
     */
    List<SummaryStock> getSummaryStock(SummaryStock summaryStock);

    /**
     * @Author Shaw
     * @Description 获取销售明细
     * @date: 2025-04-03 12:11
     * @param: //TODO
     */
    List<ErpSaleDetailsVo> selectErpSaleDetailsList(ErpSaleDto erpSaleDto);

    /**
     * @Author Shaw
     * @Description 根据单号获取销售信息
     * @date: 2025-04-03 15:15
     * @param: //TODO
     */
    ErpSaleVo getSaleInfoBySaleNo(String saleOdd);
}
